SQL versus DAO

Oft stehen sowohl die mengenorientierten Abfragesprache SQL als auch eine satzorientierte Abfragesprache wie VBA/DAO zur Wahl. Die folgende Aufgabe kann zum Beispiel mit DAO oder SQL gelöst werden:

Wer im Formular FrmAllgemeines den Aufgabentyp Mehrfachwahl gewählt hat und dann die Schaltfläche 'Aufgabe bearbeiten' drückt, gelangt in das Formular FrmMehrfachwahl. Dort können der Fragentext und vier Alternativentexte angefügt oder bearbeitet werden. Falls für die laufende Aufgabe noch kein Fragentext existiert, muss die Ereignisprozedur Form_Open für den Fragen- und die Alternativentexte Skelette einfügen, welche der Benutzer nach dem Öffnen des Formulars FrmMehrfachwahl vervollständigen kann. FrmMehrfachwahl sieht mit den eingefügten Skeletten wie folgt aus:

Jeder der vier Alternativenskelette wird durch den seinen Fragenschlüssel - eine Zahl zwischen 1 und 4 - eingeleitet, und jede Benutzerlösung wird am rechten Rand durch ein leeres Kästchen angezeigt. Der folgende Entwurfscode skizziert die Logik der Ereignisprozedur:

Öffne FrmMehrfachwahl
  Falls zur laufenden Aufgabe kein Fragentext existiert dann
    Füge der Tabelle FRAGENTEXT eine Zeile mit den folgenden Attributwerten hinzu:
      Fragenschlüssel = Fragenschlüssel der laufenden Aufgabe
      Fragentext = ""
    Füge MEHRFACH_ALTERNATIVEN vier Zeilen mit den folgenden Attributwerten hinzu:
      Fragenschlüssel = Fragenschlüssel der laufenden Aufgabe
      Alternativenschlüssel = 1, 2, 3 bzw. 4
      Alternativentext = ""
      Musterlösung = 0

Dieser Entwurfscode lässt sich entweder mit DAO-Methoden oder eingebetteten SQL-Anweisungen implementieren. Beide Varianten prüfen zuerst, ob die Tabelle FRAGENTEXT für den laufenden Fragenschlüssel bereits eine Zeile enthält. Wenn zum Beispiel für den laufenden Fragenschlüssel 1 das Ergebnis des Funktionsaufrufs DLookup("[Fragenschlüssel]", "FRAGENTEXT", "Fragenschlüssel = 1") Null ist, dann benutzt der Code die DAO-Methode AddNew (1) oder die SQL-Aktionsanweisung INSERT (2), um die Skelette für den Fragentext und die vier Alternativen einzufügen. Der variantentypische Code ist fett markiert. Sie können sich die DAO-Variante ansehen, indem Sie aus dem Formular FrmMehrwachwahl Ansicht/Entwurfsansicht wählen, »Alt/Enter drücken und dann von der Ereignisprozedur Beim Öffnen des Formulars zum Code gehen.

1. Implementation mit DAO

'--- Alternativenskelette einfügen
Private Sub Form_Open(Cancel As Integer)
  Dim Kriterium As String
  Dim MCFragentext As Variant
  Dim strFragenschlüssel As String
  Dim Alternativenschlüssel As Integer
  Dim strAlternativenschlüssel As String
  Dim dbs As Database
  Dim rstMEHRFACHWAHL_ALTERNATIVEN As Recordset
  Dim rstFRAGENTEXT As Recordset

  'OpenArgs: aus FrmAllgemeines beim Öffnen von FrmMehrfachwahl übergebenes Argument
  strFragenschlüssel = Forms!FrmMehrfachwahl.OpenArgs
  Kriterium = "[Fragenschlüssel]=" & strFragenschlüssel
  MCFragentext = DLookup("[Fragenschlüssel]", "FRAGENTEXT", Kriterium)
  '-- Nur anfügen, falls Aufgabe neu
  If IsNull(MCFragentext) = True Then

    '*** Implementation mit DAO
    Set dbs = CurrentDb
    Set rstFRAGENTEXT = dbs.OpenRecordset("
FRAGENTEXT")
    With rstFRAGENTEXT
      .AddNew
        !Fragenschlüssel = strFragenschlüssel
        !Fragentext = ""
      .Update
      .Close
    End With
'rstFRAGEN
    Set rstFRAGENTEXT = Nothing
    Set rstMEHRFACHWAHL_ALTERNATIVEN = dbs.OpenRecordset("
MEHRFACHWAHL_ALTERNATIVEN")
    With rstMEHRFACHWAHL_ALTERNATIVEN
      For Alternativenschlüssel = 1 To 4
       
strAlternativenschlüssel = CStr(Alternativenschlüssel)
        .AddNew
          !Fragenschlüssel = strFragenschlüssel
          !Alternativenschlüssel = strAlternativenschlüssel
          !Alternativentext = ""
          !Musterlösung = 0
        .Update
      Next Alternativenschlüssel
      .Close
    End With 'rstMEHRFACHWAHL_ALTERNATIVEN
    Set rstMEHRFACHWAHL_ALTERNATIVEN = Nothing
    Set dbs = Nothing

  End If 'IsNull(MCFragentext)
  Requery 'Bildschirm anpassen
End Sub

2. Implementation mit SQL

'--- Implemenation mit SQL
Dim strSQL As String 
'... (wie oben)

strSQL = "INSERT INTO FRAGENTEXT " & _
  "(Fragenschlüssel, Fragentext) " & _
  "VALUES ('" & strFragenschlüssel & "', '');"
.Execute strSQL, dbFailOnError
For Alternativenschlüssel = 1 To 4
 
strAlternativenschlüssel = CStr(Alternativenschlüssel)
  strSQL = "INSERT INTO
MEHRFACHWAHL_ALTERNATIVEN " & _
    "(Fragenschlüssel, Alternativenschlüssel, Alternativentext, Musterlösung) " & _
    "VALUES ('" & strFragenschlüssel & "', '" & strAlternativenschlüssel & "', '', '0');"
  .Execute strSQL, dbFailOnError
Next Alternativenschlüssel

'...(wie oben)

INSERT

DAO-Methode AddNew